package com.obggtc.picture.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.obggtc.picture.entity.MediaFile;

import java.util.List;

/**
 * 媒体文件服务接口
 */
public interface MediaFileService extends IService<MediaFile> {
    
    /**
     * 保存媒体文件信息
     * @param mediaFile 媒体文件信息
     * @return 是否成功
     */
    boolean saveMediaFile(MediaFile mediaFile);
    
    /**
     * 根据文件ID获取媒体文件信息（优先从缓存获取）
     * @param fileId 文件ID
     * @return 媒体文件信息
     */
    MediaFile getMediaFileByFileId(String fileId);
    
    /**
     * 分页查询用户的媒体文件（带缓存）
     * @param uploader 上传者
     * @param fileType 文件类型（可选）
     * @param page 页码
     * @param size 每页大小
     * @return 分页结果
     */
    IPage<MediaFile> getUserMediaFiles(String uploader, Integer fileType, int page, int size);
    
    /**
     * 根据标签搜索媒体文件（带缓存）
     * @param tag 标签
     * @param fileType 文件类型（可选）
     * @param page 页码
     * @param size 每页大小
     * @return 分页结果
     */
    IPage<MediaFile> getMediaFilesByTag(String tag, Integer fileType, int page, int size);
    
    /**
     * 获取最近上传的媒体文件（带缓存）
     * @param fileType 文件类型（可选）
     * @param count 数量
     * @return 媒体文件列表
     */
    List<MediaFile> getRecentMediaFiles(Integer fileType, int count);
    
    /**
     * 获取热门媒体文件（带缓存）
     * @param fileType 文件类型（可选）
     * @param count 数量
     * @return 媒体文件列表
     */
    List<MediaFile> getHotMediaFiles(Integer fileType, int count);
    
    /**
     * 增加观看次数
     * @param fileId 文件ID
     * @return 当前观看次数
     */
    long incrementViewCount(String fileId);
    
    /**
     * 增加下载次数
     * @param fileId 文件ID
     * @return 当前下载次数
     */
    long incrementDownloadCount(String fileId);
    
    /**
     * 删除媒体文件（逻辑删除）
     * @param fileId 文件ID
     * @param uploader 上传者（权限验证）
     * @return 是否成功
     */
    boolean deleteMediaFile(String fileId, String uploader);
    
    /**
     * 统计用户媒体文件数量
     * @param uploader 上传者
     * @param fileType 文件类型（可选）
     * @return 数量
     */
    long countUserMediaFiles(String uploader, Integer fileType);
    
    /**
     * 清除媒体文件相关缓存
     * @param fileId 文件ID
     */
    void clearMediaFileCache(String fileId);
    
    /**
     * 刷新热门媒体文件缓存
     */
    void refreshHotMediaFilesCache();
}
